package cn.song.freight.domain.dto;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

/**
 * 新增区域请求参数
 *
 * @author SongRenShuo
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "新增区域请求参数")
public class AreaAddDTO {

    /**
     * 省份编码（如：110000）
     */
    @NotBlank(message = "省份编码不能为空")
    @ApiModelProperty(value = "省份编码（如：110000）", required = true)
    private String provinceCode;

    /**
     * 城市编码（如：110100），level>=2时必填
     */
    @ApiModelProperty(value = "城市编码（如：110100），level>=2时必填")
    private String cityCode;

    /**
     * 县区编码（如：110101），level=3时必填
     */
    @ApiModelProperty(value = "县区编码（如：110101），level=3时必填")
    private String districtCode;

    /**
     * 省份全称（如：北京市、广东省、新疆维吾尔自治区）
     */
    @NotBlank(message = "省份全称不能为空")
    @ApiModelProperty(value = "省份全称（如：北京市、广东省、新疆维吾尔自治区）", required = true)
    private String provinceName;

    /**
     * 城市全称（如：北京市、广州市），level>=2时必填
     */
    @ApiModelProperty(value = "城市全称（如：北京市、广州市），level>=2时必填")
    private String cityName;

    /**
     * 区县全称（如：朝阳区、天河区），level=3时必填
     */
    @ApiModelProperty(value = "区县全称（如：朝阳区、天河区），level=3时必填")
    private String districtName;

    /**
     * 省份简称（如：北京、广东、新疆）
     */
    @NotBlank(message = "省份简称不能为空")
    @ApiModelProperty(value = "省份简称（如：北京、广东、新疆）", required = true)
    private String provinceShortName;

    /**
     * 城市简称（如：北京、广州、深圳），level>=2时必填
     */
    @ApiModelProperty(value = "城市简称（如：北京、广州、深圳），level>=2时必填")
    private String cityShortName;

    /**
     * 区县简称（如：朝阳、天河、南山），level=3时必填
     */
    @ApiModelProperty(value = "区县简称（如：朝阳、天河、南山），level=3时必填")
    private String districtShortName;

    /**
     * 地址层级：1-省份，2-城市，3-区县
     */
    @NotNull(message = "地址层级不能为空")
    @ApiModelProperty(value = "地址层级：1-省份，2-城市，3-区县", required = true)
    private Integer level;

    public String getCityCode() {
        return cityCode == null ? "" : cityCode;
    }

    public String getDistrictCode() {
        return districtCode == null ? "" : districtCode;
    }

    public String getCityName() {
        return cityName == null ? "" : cityName;
    }

    public String getDistrictName() {
        return districtName == null ? "" : districtName;
    }

    public String getCityShortName() {
        return cityShortName == null ? "" : cityShortName;
    }

    public String getDistrictShortName() {
        return districtShortName == null ? "" : districtShortName;
    }

    /**
     * 校验当前层级对应的必填字段
     */
    public void validateByLevel() {
        if (level == null) {
            throw new IllegalArgumentException("地址层级不能为空");
        }

        // 根据层级校验对应字段
        switch (level) {
            // 城市层级
            case 2:
                if (getCityCode().trim().isEmpty()) {
                    throw new IllegalArgumentException("城市层级时，城市编码不能为空");
                }
                if (getCityName().trim().isEmpty()) {
                    throw new IllegalArgumentException("城市层级时，城市名称不能为空");
                }
                break;
            // 区县层级
            case 3:
                if (getCityCode().trim().isEmpty()) {
                    throw new IllegalArgumentException("区县层级时，城市编码不能为空");
                }
                if (getCityName().trim().isEmpty()) {
                    throw new IllegalArgumentException("区县层级时，城市名称不能为空");
                }
                if (getDistrictCode().trim().isEmpty()) {
                    throw new IllegalArgumentException("区县层级时，区县编码不能为空");
                }
                if (getDistrictName().trim().isEmpty()) {
                    throw new IllegalArgumentException("区县层级时，区县名称不能为空");
                }
                break;
            // 省份层级，不需要额外校验
            case 1:
            default:
                break;
        }
    }
}
